const LRUCache = require("../template")

function testLRUCacheBehavior() {
  console.log(
    "1. 访问顺序影响 LRU 测试:",
    (() => {
      const cache = new LRUCache(2)
      cache.put(1, "a")
      cache.put(2, "b")
      cache.get(1) // 访问 1，使其成为最近使用
      cache.put(3, "c") // 添加 3，应该移除 2
      return cache.get(1) === "a" &&
             cache.get(2) === -1 &&
             cache.get(3) === "c"
    })()
  )

  console.log(
    "2. 更新操作影响 LRU 测试:",
    (() => {
      const cache = new LRUCache(2)
      cache.put(1, "a")
      cache.put(2, "b")
      cache.put(1, "aa") // 更新 1，使其成为最近使用
      cache.put(3, "c") // 添加 3，应该移除 2
      return cache.get(1) === "aa" &&
             cache.get(2) === -1 &&
             cache.get(3) === "c"
    })()
  )

  console.log(
    "3. 复杂访问模式测试:",
    (() => {
      const cache = new LRUCache(3)
      cache.put(1, "a")
      cache.put(2, "b")
      cache.put(3, "c")
      cache.get(2) // 访问 2
      cache.get(1) // 访问 1
      cache.put(4, "d") // 添加 4，应该移除 3 (最久未使用)
      return cache.get(1) === "a" &&
             cache.get(2) === "b" &&
             cache.get(3) === -1 &&
             cache.get(4) === "d"
    })()
  )

  console.log(
    "4. 频繁访问模式测试:",
    (() => {
      const cache = new LRUCache(3)
      cache.put(1, "a")
      cache.put(2, "b")
      cache.put(3, "c")
      // 频繁访问 1
      for (let i = 0; i < 5; i++) {
        cache.get(1)
      }
      cache.put(4, "d") // 应该移除 2 (最久未使用)
      return cache.get(1) === "a" &&
             cache.get(2) === -1 &&
             cache.get(3) === "c" &&
             cache.get(4) === "d"
    })()
  )

  console.log(
    "5. 混合操作模式测试:",
    (() => {
      const cache = new LRUCache(4)
      cache.put(1, "a")
      cache.put(2, "b")
      cache.get(1) // 访问 1
      cache.put(3, "c")
      cache.put(4, "d")
      cache.get(2) // 访问 2
      cache.put(5, "e") // 应该移除 3 (最久未使用)
      return cache.get(1) === "a" &&
             cache.get(2) === "b" &&
             cache.get(3) === -1 &&
             cache.get(4) === "d" &&
             cache.get(5) === "e"
    })()
  )

  console.log(
    "6. this上下文LRU行为测试:",
    (() => {
      const lruObj = {
        multiplier: 2,
        createCache: function(capacity) {
          const cache = new LRUCache(capacity * this.multiplier)
          cache.put(1, "a")
          cache.put(2, "b")
          cache.get(1) // 访问 1
          cache.put(3, "c") // 应该移除 2
          return cache.get(2) === -1 && cache.get(3) === "c"
        }
      }
      return lruObj.createCache(1) // 容量 2
    })()
  )

  console.log(
    "7. 复杂对象this绑定LRU行为测试:",
    (() => {
      const lruConfigObj = {
        config: { threshold: 2 },
        createConfigCache: function() {
          const cache = new LRUCache(this.config.threshold)
          cache.put(1, "a")
          cache.put(2, "b")
          cache.put(1, "aa") // 更新 1
          cache.put(3, "c") // 应该移除 2
          return cache.get(1) === "aa" && cache.get(2) === -1
        }
      }
      return lruConfigObj.createConfigCache()
    })()
  )

  console.log(
    "8. LRU行为一致性测试:",
    (() => {
      const cache = new LRUCache(3)
      cache.put(1, "a")
      cache.put(2, "b")
      cache.put(3, "c")
      cache.put(4, "d") // 应该移除 1
      cache.put(5, "e") // 应该移除 2
      cache.put(6, "f") // 应该移除 3
      return cache.get(1) === -1 &&
             cache.get(2) === -1 &&
             cache.get(3) === -1 &&
             cache.get(4) === "d" &&
             cache.get(5) === "e" &&
             cache.get(6) === "f"
    })()
  )
}

testLRUCacheBehavior()
